/**	
 * タイトル：	时间工具类
 * 説明：    	
 *			
 * 会社名：	紹興日創軟件有限公司
 * 変更履歴：	2014/08/25 NIS 何
 *			新規作成
 *
 */
package com.nissoft.framework.util;

import java.text.ParseException;
import java.text.ParsePosition;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;

/**
 * @author NIS 何
 * @version 1.0
 */
public abstract class DateUtil {

	public static final String DEFAULT_FORMAT = "yyyy/MM/dd HH:mm:ss";

	/**
	 * 格式化时间 --> yyyy/MM/dd HH:mm:ss
	 * 
	 * @param date
	 *            时间
	 */
	public static String format(Date date) {
		return format(date, DEFAULT_FORMAT);
	}

	/**
	 * 格式化时间
	 * 
	 * @param date
	 *            时间
	 * @param pattern
	 *            给定格式
	 */
	public static String format(Date date, String pattern) {
		SimpleDateFormat sdf = new SimpleDateFormat(pattern);
		return sdf.format(date);
	}

	/**
	 * 解析时间
	 * 
	 * @param source
	 *            源字符串
	 * @param pattern
	 *            给定格式
	 * @throws ParseException
	 */
	public static Date parse(String source, String pattern)
			throws ParseException {
		return parse(source, pattern, 0);
	}

	/**
	 * 解析时间,从给定索引开始解析<br>
	 * 如:a2014/11/11 14:15:22,从索引1开始解析
	 * 
	 * @param source
	 *            源字符串
	 * @param pattern
	 *            给定格式
	 * @param parseIndex
	 *            索引:从0开始
	 * @throws ParseException
	 */
	public static Date parse(String source, String pattern, int parseIndex)
			throws ParseException {
		SimpleDateFormat sdf = new SimpleDateFormat(pattern);
		return sdf.parse(source, new ParsePosition(parseIndex));
	}

	/**
	 * 加N年
	 * 
	 * @param date
	 *            给定时间
	 * @param offset
	 *            天的偏移量<br>
	 *            (+1：加一年；-1：减一年)
	 */
	public static Date addYear(Date date, int offset) {
		return add(date, Calendar.YEAR, offset);
	}

	/**
	 * 加N月
	 * 
	 * @param date
	 *            给定时间
	 * @param offset
	 *            天的偏移量<br>
	 *            (+1：加一月；-1：减一月)
	 */
	public static Date addMonth(Date date, int offset) {
		return add(date, Calendar.MONTH, offset);
	}

	/**
	 * 加N天
	 * 
	 * @param date
	 *            给定时间
	 * @param offset
	 *            天的偏移量<br>
	 *            (+1：加一天；-1：减一天)
	 */
	public static Date addDay(Date date, int offset) {
		// return addMillisecond(date, offset * 24 * 60 * 60 * 1000l);
		return add(date, Calendar.DAY_OF_YEAR, offset);
	}

	/**
	 * 加N小时
	 * 
	 * @param date
	 *            给定时间
	 * @param offset
	 *            小时的偏移量<br>
	 *            (+1：加一小时；-1：减一小时)
	 * @return
	 */
	public static Date addHour(Date date, int offset) {
		// return addMillisecond(date, offset * 60 * 60 * 1000l);
		return add(date, Calendar.HOUR, offset);
	}

	/**
	 * 加N分钟
	 * 
	 * @param date
	 *            给定时间
	 * @param offset
	 *            分钟的偏移量<br>
	 *            (+1：加一分钟；-1：减一分钟)
	 */
	public static Date addMinute(Date date, int offset) {
		// return addMillisecond(date, offset * 60 * 1000l);
		return add(date, Calendar.MINUTE, offset);
	}

	/**
	 * 加N秒
	 * 
	 * @param date
	 *            给定时间
	 * @param offset
	 *            分钟的偏移量<br>
	 *            (+1：加一秒；-1：减一秒)
	 */
	public static Date addSecond(Date date, int offset) {
		// return addMillisecond(date, offset * 1000l);
		return add(date, Calendar.SECOND, offset);
	}

	/**
	 * 加N毫秒
	 * 
	 * @param date
	 *            给定时间
	 * @param mill
	 *            毫秒数
	 */
	public static Date addMillisecond(Date date, long mill) {
		if (mill == 0) {
			return date;
		}
		return new Date(date.getTime() + mill);
	}

	private static Date add(Date date, int field, int offset) {
		
		if (offset == 0) {
			return date;
		}
		Calendar cale = Calendar.getInstance();
		cale.setTime(date);
		cale.add(field, offset);
		return cale.getTime();
	}
}
